package ar.edu.utn.frsf.tpae.a2012.g02.presentacion.controlador;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;

import ar.edu.utn.frsf.tpae.a2012.g02.models.Cuenta;
import ar.edu.utn.frsf.tpae.a2012.g02.models.Movimiento;

/**
 * Bean utilizado para asociar elementos del modelo
 * con campos de la interfaz grafica de la pagina ver movimientos.
 * {@code verMovimientos.jsp}
 *
 */
public class MovimientosBean {

	private Cuenta cuenta;
	
	/**
	 * Metodo utilizado para cargar la pagina verMovimientos.jsp,
	 * buscando la cuenta con el id recibido como parametro para mostras sus movimientos
	 * 
	 * @return
	 */
	public String cargarPagina() {
		String id =  FacesContext.getCurrentInstance()
				.getExternalContext().getRequestParameterMap().get("id");
		long nroCuenta = new Long(id);
		FacesContext context = FacesContext.getCurrentInstance();
		CuentasBean bean = (CuentasBean) context.getApplication().evaluateExpressionGet(context, "#{cuentasBean}", CuentasBean.class);
		for(Cuenta cta: bean.getCuentas()) {
			if (cta.getNroCuenta() == nroCuenta) {
				cuenta = cta;			
				break;
			}
		}
		if (cuenta != null) {
			return "verMovimientos";
		}
		return null;
	}
	
	/**
	 * Metodo utilizado desde verMovimientos.jsp para exportar un archivo
	 * con los datos de los movimientos en formato CSV
	 * 
	 * @return
	 */
	public String exportar() {

		String fileName = "Movimientos_Cuenta_" + cuenta.getNroCuenta() + ".csv";
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        try {
	        response.reset();
	        response.setContentType("text/comma-separated-values");
	        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
	        OutputStream output = response.getOutputStream();
	        crearArchivoCSV(output);
        	output.flush();
        	output.close();
        } catch (IOException e) {
        	ResourceBundle bundle = ResourceBundle.getBundle("mensajes", context.getViewRoot().getLocale());
        	context.addMessage(null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR, bundle
							.getString("error.creacionarchivo"), ""));
		}
        context.responseComplete();
        
		return null;
	}
	
	/**
	 * Crea una lista de strings con cada linea del archivo CSV 
	 * y las escribe sobre el OutputStream
	 * 
	 * @param output
	 * @throws IOException
	 */
	private void crearArchivoCSV(OutputStream output) throws IOException {
		List<String> strings = new ArrayList<String>();
        
		for (Movimiento m : cuenta.getMovimientos() ) {
			strings.add(m.getFecha().toString() + ";" + m.getTipoMovimiento()
					+ ";" + m.getDescripcion() + ";" + m.getMonto() + "\n");
        }
        
        for (String s : strings) {
				output.write(s.getBytes());
        }
		
	}

	public Cuenta getCuenta() {
		return cuenta;
	}
	public void setCuenta(Cuenta cuenta) {
		this.cuenta = cuenta;
	}
}
